package englishChicken;

import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;

public class Usuario{
	
	private String id;
	private String uid;
	private Double latitud;
	private Double longitud;
	private String apodo;
	private String pass;
	private String nombre;
	private String apellidos;
	private String fechaNacimiento;
	private char sexo;
	private String direccion;
	private String email;
	private String nacionalidad;
	private List<Juego> juegosJugadosJ;
	private List<Juego> juegosApadrinadosJ;
	private List<Evento> asistenciaEventosE;
	private List<Juego> solicitudPadrinoJ;
	
	public Usuario(){
		apodo="vacio";
		pass = "";
		nombre="vacio";
		apellidos="vacio";
		fechaNacimiento="00/00/0000";
		sexo='X';
		direccion="vacio";
		email="vacio";
		latitud=new Double(0);
		longitud=new Double(0);
		nacionalidad="vacio";
		juegosJugadosJ=new LinkedList<Juego>();
		juegosApadrinadosJ=new LinkedList<Juego>();
		asistenciaEventosE=new LinkedList<Evento>();
		solicitudPadrinoJ=new LinkedList<Juego>();
	}
	
	public Usuario(String ap, String pwd, String name, String apell, String fechaN, char s, double[] loc){
		apodo=ap;
		pass = pwd;
		nombre=name;
		apellidos=apell;
		fechaNacimiento=fechaN;
		sexo=s;
		direccion="vacio";
		email="vacio";
		latitud=loc[0];
		longitud=loc[1];
		nacionalidad="vacio";
		juegosJugadosJ=new LinkedList<Juego>();
		juegosApadrinadosJ=new LinkedList<Juego>();
		asistenciaEventosE=new LinkedList<Evento>();
	}
	public Usuario(String ap, String pwd, String name, String apell, String fechaN, char s, double[] loc, String d, String nac, String e){
		apodo=ap;
		pass = pwd;
		nombre=name;
		apellidos=apell;
		fechaNacimiento=fechaN;
		sexo=s;
		direccion=d;
		email=e;
		latitud=loc[0];
		longitud=loc[1];
		nacionalidad=nac;
		juegosJugadosJ=new LinkedList<Juego>();
		juegosApadrinadosJ=new LinkedList<Juego>();
		asistenciaEventosE=new LinkedList<Evento>();
	}
	
	public Usuario(String apodo){
		this();
		this.apodo=apodo;
	}
	
	public Usuario(String apodo, String pass){
		this(apodo);
		this.pass = pass;
	}
	
	public String getApodo() {
		return apodo;
	}
	public void setApodo(String apodo) {
		this.apodo = apodo;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellidos() {
		return apellidos;
	}
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
	public String getFechaNacimiento() {
		return fechaNacimiento;
	}
	public void setFechaNacimiento(String fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}
	public char getSexo() {
		return sexo;
	}
	public void setSexo(char sexo) {
		this.sexo = sexo;
	}
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getNacionalidad(){
		return nacionalidad;
	}
	public void setNacionalidad(String nacionalidad){
		this.nacionalidad = nacionalidad;
	}

	public int compareTo(Object o) {
		return this.apodo.compareTo(((Usuario)o).getApodo());
	}

	public double[] getLocalizacion() {
		double[] ret=new double[2];
		ret[0]=latitud;
		ret[1]=longitud;
		return ret;
	}

	public void setLocalizacion(double[] localizacion) {
		latitud=localizacion[0];
		longitud=localizacion[1];
	}

	public List<String> getJuegosJugados() {
		List<String> pet=new LinkedList<String>();
		Iterator<Juego> petIT=juegosJugadosJ.iterator();
		while(petIT.hasNext()){
			Juego petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}

	public void setJuegosJugados(List<String> juegosJugados) {
		List<Juego> pet=new LinkedList<Juego>();
		Iterator<String> petIT=juegosJugados.iterator();
		AlmacenDeJuegos adj=AlmacenDeJuegos.getInstance();
		while(petIT.hasNext()){
			Juego petITAct=adj.getJuegoUid(petIT.next());
			pet.add(petITAct);
		}
		this.juegosJugadosJ = pet;
	}

	public List<String> getJuegosApadrinados() {
		List<String> pet=new LinkedList<String>();
		Iterator<Juego> petIT=juegosApadrinadosJ.iterator();
		while(petIT.hasNext()){
			Juego petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}

	public void setJuegosApadrinados(List<String> juegosApadrinados) {
		List<Juego> pet=new LinkedList<Juego>();
		Iterator<String> petIT=juegosApadrinados.iterator();
		AlmacenDeJuegos adj=AlmacenDeJuegos.getInstance();
		while(petIT.hasNext()){
			Juego petITAct=adj.getJuegoUid(petIT.next());
			pet.add(petITAct);
		}
		this.juegosApadrinadosJ = pet;
	}
	public List<String> getAsistenciaEventos(){
		List<String> pet=new LinkedList<String>();
		Iterator<Evento> petIT=asistenciaEventosE.iterator();
		while(petIT.hasNext()){
			Evento petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}
	public void setAsistenciaEventos(List<String> asistenciaEventos){
		List<Evento> pet=new LinkedList<Evento>();
		Iterator<String> petIT=asistenciaEventos.iterator();
		AlmacenDeEventos ade=AlmacenDeEventos.getInstance();
		while(petIT.hasNext()){
			Evento petITAct=ade.getEventoUid(petIT.next());
			pet.add(petITAct);
		}
		this.asistenciaEventosE=pet;
	}
	
	public int getEdad(){
		String fechanac=this.fechaNacimiento;
		Calendar fechaNac=Calendar.getInstance();
		fechaNac.set(Integer.parseInt(fechanac.split("-")[0])
		,Integer.parseInt(fechanac.split("-")[1])
		,Integer.parseInt(fechanac.split("-")[2]));
		Calendar today = Calendar.getInstance();
		   
	    int diff_year = today.get(Calendar.YEAR) - fechaNac.get(Calendar.YEAR);
	    int diff_month = today.get(Calendar.MONTH) - fechaNac.get(Calendar.MONTH);
	    int diff_day = today.get(Calendar.DAY_OF_MONTH) - fechaNac.get(Calendar.DAY_OF_MONTH);

	    if(diff_month<0 || (diff_month==0 && diff_day<0)){
	        diff_year = diff_year - 1;
	    }
	    return diff_year;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}
	
	public void setPassMd5(String pass){
		this.pass=pass;
	}
	
	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}
	
	public void addJuegoJugado (String jUid)
	{
		AlmacenDeJuegos adj = AlmacenDeJuegos.getInstance();
		boolean found = false;
		
        if (juegosJugadosJ == null) {
        	juegosJugadosJ = new LinkedList<Juego>();
        } else if(adj.getJuegoUid(jUid)!=null){
        	Iterator<String> iter = this.getJuegosJugados().iterator();
            while (iter.hasNext() && !found) {
            	String d = iter.next();
                if (d.compareTo(jUid)==0) {
                	found = true;
                }
           }
        }
        if (!found) {
        	juegosJugadosJ.add(adj.getJuegoUid(jUid));
        }
	}
	
	public void removeJuegoJugado(String uid){
		Iterator<String> jjIT=this.getJuegosJugados().iterator();
		while(jjIT.hasNext()){
			Object jjAct=jjIT.next();
			if(jjAct.equals(uid)){
				juegosJugadosJ.remove(jjAct);
				break;
			}
		}
	}
	
	public boolean esPadrino (String jUid, String uUid)
	{
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		boolean es = false;
		Usuario user = adu.getUsuarioUid(uUid);
		if (user != null){
			Iterator<String> it = user.getJuegosApadrinados().iterator();
			while (it.hasNext() && !es){
				String j = it.next();
				if(j.compareTo(jUid)==0)
					es = true;
			}
		}
		return es;
	}
	
	public void addJuegoApadrinado (String jUid, String uUid)
	{
		AlmacenDeJuegos adj = AlmacenDeJuegos.getInstance();
		boolean found = false;
		
        if (juegosApadrinadosJ == null) {
        	juegosApadrinadosJ = new LinkedList<Juego>();
        } else if(adj.getJuegoUid(jUid)!=null && esPadrino (jUid, uUid) && uUid.compareTo(uid)!=0){
        	Iterator<String> iter = this.getJuegosApadrinados().iterator();
            while (iter.hasNext() && !found) {
            	String d = (String) iter.next();
                if (d.compareTo(jUid)==0) {
                	found = true;
                }
           }
        }
        if (!found) {
        	juegosApadrinadosJ.add(adj.getJuegoUid(jUid));
        }
		
	}
	
	public void removeJuegoApadrinado (String jUid)
	{
		Iterator<String> padIT=this.getJuegosApadrinados().iterator();
		while(padIT.hasNext()){
			Object padAct=padIT.next();
			if(((String)padAct).equals(uid)){
				juegosApadrinadosJ.remove(padAct);
				break;
			}
		}
	}

	public List<String> getSolicitudPadrino() {
		List<String> pet=new LinkedList<String>();
		Iterator<Juego> petIT=solicitudPadrinoJ.iterator();
		while(petIT.hasNext()){
			Juego petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}

	public void setSolicitudPadrino(List<String> solicitudPadrino) {
		List<Juego> pet=new LinkedList<Juego>();
		Iterator<String> petIT=solicitudPadrino.iterator();
		AlmacenDeJuegos adj=AlmacenDeJuegos.getInstance();
		while(petIT.hasNext()){
			Juego petITAct=adj.getJuegoUid(petIT.next());
			pet.add(petITAct);
		}
		this.solicitudPadrinoJ = pet;
	}
	
	public void addSolicitudPadrino(String uid){
		AlmacenDeJuegos adj=AlmacenDeJuegos.getInstance();
		solicitudPadrinoJ.add(adj.getJuegoUid(uid));
	}
	public void removeSolicitudPadrino(String uid){
		Iterator<String> solPadIT=this.getSolicitudPadrino().iterator();
		while(solPadIT.hasNext()){
			Object solPadAct=solPadIT.next();
			if(solPadAct.equals(uid)){
				solicitudPadrinoJ.remove(solPadAct);
				break;
			}
		}
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public double getLatitud() {
		return latitud;
	}

	public void setLatitud(double latitud) {
		this.latitud = latitud;
	}

	public double getLongitud() {
		return longitud;
	}

	public void setLongitud(double longitud) {
		this.longitud = longitud;
	}

	public List<Juego> getJuegosJugadosJ() {
		return juegosJugadosJ;
	}

	public void setJuegosJugadosJ(List<Juego> juegosJugadosJ) {
		this.juegosJugadosJ = juegosJugadosJ;
	}

	public List<Juego> getJuegosApadrinadosJ() {
		return juegosApadrinadosJ;
	}

	public void setJuegosApadrinadosJ(List<Juego> juegosApadrinadosJ) {
		this.juegosApadrinadosJ = juegosApadrinadosJ;
	}

	public List<Evento> getAsistenciaEventosE() {
		return asistenciaEventosE;
	}

	public void setAsistenciaEventosE(List<Evento> asistenciaEventosE) {
		this.asistenciaEventosE = asistenciaEventosE;
	}

	public List<Juego> getSolicitudPadrinoJ() {
		return solicitudPadrinoJ;
	}

	public void setSolicitudPadrinoJ(List<Juego> solicitudPadrinoJ) {
		this.solicitudPadrinoJ = solicitudPadrinoJ;
	}

	public void setLatitud(Double latitud) {
		this.latitud = latitud;
	}

	public void setLongitud(Double longitud) {
		this.longitud = longitud;
	}
}
